#include "mydelegate.h"
#include <QApplication>
#include <QTextDocument>
#include <QAbstractTextDocumentLayout>
#include <QPainter>

// TableView 代理,可显示富文本
MyDelegate::MyDelegate()
{

}

void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // 注意，此时index是logicIndex（model坐标），我们可以通过拖拽表头项交换列来测试
    Q_ASSERT(index.isValid());
    // QStyle会根据option的属性进行绘制，我们也可以不使用QStyle的规则，完全自定义
    QStyleOptionViewItem opt = option;
    // 参照源码实现了自己的initStyleOption
    initStyleOption(&opt, index);

    QStyle *style = opt.widget? opt.widget->style() : QApplication::style();

    QTextDocument doc;
    doc.setHtml(opt.text);

    /// Painting item without text
    opt.text = QString();
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter);

    QAbstractTextDocumentLayout::PaintContext ctx;

    // 选中项目时高亮显示文本
    if (opt.state & QStyle::State_Selected)
        ctx.palette.setColor(QPalette::Text, opt.palette.color(QPalette::Active, QPalette::HighlightedText));

    QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &opt);
    painter->save();
    painter->translate(textRect.topLeft());
    painter->setClipRect(textRect.translated(-textRect.topLeft()));
    doc.documentLayout()->draw(painter, ctx);
    painter->restore();
}
